﻿	#pragma once
	#define _CRT_SECURE_NO_WARNINGS // Should ideally be defined in project settings, but okay here for simplicity
	#include <string> // For std::string

	// Forward declare DbgHelp types to avoid including heavy Windows headers here if possible
	// struct _EXCEPTION_POINTERS; // Included via windows.h in cpp anyway

	namespace AC {
		class DumpHelper
		{
		public:
			/// <summary>
			/// 定义不同的Dump模式
			/// </summary>
			enum class DumpMode {
				Minimal, // 包含线程、模块、调用堆栈和少量内存信息，体积较小
				Full     // 包含进程所有内存信息，体积较大 (等同于之前的行为)
			};

			/// <summary>
			/// 设置是否记录崩溃转储。建议使用 Start() 函数。
			/// </summary>
			/// <param name="value">是否记录崩溃转储</param>
			static void SetIsDumpCrash(bool value);

			/// <summary>
			/// 设置崩溃转储路径。可以是绝对路径或相对于可执行文件的相对路径。
			/// 默认为可执行文件目录下的 "dmp" 子目录 (如果调用 Start())。
			/// </summary>
			/// <param name="directory">崩溃转储路径</param>
			static void SetDumpDirectory(const std::string& directory);

			/// <summary>
			/// 设置崩溃转储文件的最大数量。超过数量时会自动删除最旧的文件。
			/// </summary>
			/// <param name="count">最大文件数量，默认10。设置为0则不限制（不推荐）。</param>
			static void SetDumpMaxFileCount(int count);

			/// <summary>
			/// 设置崩溃时生成的Dump文件类型。
			/// </summary>
			/// <param name="mode">Dump模式 (Minimal 或 Full)，默认为 Minimal</param>
			static void SetDumpMode(DumpMode mode);

			/// <summary>
			/// 获取内存快照转储,可以任意时刻记录（包括非崩溃情况下）。
			/// 使用当前通过 SetDumpMode 设置的全局模式。
			/// </summary>
			/// <param name="path">保存文件名（包含路径）</param>
			static void Snapshot(const std::string& path);

			/// <summary>
			/// 获取内存快照转储,可以任意时刻记录（包括非崩溃情况下）。
			/// 允许指定此次快照的Dump模式，覆盖全局设置。
			/// </summary>
			/// <param name="path">保存文件名（包含路径）</param>
			/// <param name="mode">指定此次快照的Dump模式</param>
			static void Snapshot(const std::string& path, DumpMode mode);

			/// <summary>
			/// 一键启动崩溃监控(建议放到程序开头)。
			/// 此函数会注册异常过滤器。
			/// 如果之前未调用 SetDumpDirectory，则默认设置为 "dmp" 子目录。
			/// Dump模式和文件数量使用默认值(Minimal, 10)或之前通过 Set* 函数设置的值。
			/// </summary>
			static void Start();
		};
	} // namespace AC